/**
 * 抽奖活动批次相关数据传输对象
 * 对应数据库表: BBL_PRIZE_ACTIVITY
 */

import { BblPrizeActivity } from "../entity/prize.activity.entity";
import { PrizeGroupListDto } from "./prize.group.dto";

/**
 * 活动批次状态映射
 * 键为数据库存储的状态值，值为显示文本
 */
export const ACTIVITY_STATUS_MAP = {
  1: "未开始",
  2: "进行中",
  3: "已结束",
  4: "已取消"
};

/**
 * 根据活动状态值获取对应的显示文本
 * @param status 活动状态数据库存储值（1-未开始，2-进行中，3-已结束，4-已取消）
 * @returns 翻译后的活动状态文本，未知状态返回格式化字符串
 */
export function getActivityStatusText(status: number): string {
  return ACTIVITY_STATUS_MAP[status] || `未知状态(${status})`;
}

/**
 * 活动批次添加传输对象
 * 用于前端向服务端传递创建活动批次的必要信息
 */
export class PrizeActivityCreateDto {
  /** 活动批次名称，前端输入的活动显示名称，必填字段 */
  batchName: string;

  /** 活动批次描述，对活动的详细说明，支持富文本或纯文本 */
  batchDesc: string;

  /** 奖品组ID，关联奖品组的唯一标识 */
  groupId: string;
}

/**
 * 活动批次列表查询传输对象
 * 用于前端向服务端传递活动批次的筛选条件
 */
export class PrizeActivityListQueryDto {
  /** 活动批次名称（模糊查询），可选字段，支持部分字符串匹配 */
  batchName?: string;

  /** 活动状态（精确查询），可选字段，与数据库存储的状态值一致 */
  status?: number;

  /** 是否包含已结束活动，可选字段，true时查询所有状态 */
  includeEnded?: boolean;

  /** 奖品组ID（精确查询），可选字段 */
  groupId?: string;
}

/**
 * 活动批次分页查询传输对象
 * 继承列表查询条件并添加分页参数
 */
export class PrizeActivityPageQueryDto {
  /** 活动批次名称（模糊查询），可选字段 */
  batchName?: string;

  /** 活动状态（精确查询），可选字段 */
  status?: number;

  /** 是否包含已结束活动，可选字段 */
  includeEnded?: boolean;

  /** 奖品组ID（精确查询），可选字段 */
  groupId?: string;

  /** 每页显示数量，字符串类型（前端传递时通常为字符串） */
  pageSize: string;

  /** 当前页码，字符串类型（前端传递时通常为字符串） */
  current: string;
}

/**
 * 活动批次列表传输对象
 * 用于服务端向前端返回活动批次列表的简化数据结构
 */
export class PrizeActivityListDto {
  constructor(activity: BblPrizeActivity) {
    this.id = activity.id;
    this.batchName = activity.batchName;
    this.status = activity.status;
    this.statusText = getActivityStatusText(activity.status);
    this.startTime = activity.startTime ? activity.startTime.getTime() : 0;
    this.endTime = activity.endTime ? activity.endTime.getTime() : 0;
    this.totalCodes = activity.totalCodes;
    this.usedCodes = activity.usedCodes;
    this.createdAt = activity.createdAt.getTime();
    this.prizeGroup = activity.prizeGroup
      ? new PrizeGroupListDto(activity.prizeGroup)
      : null;
  }

  /** 活动批次主键ID，业务自定义的唯一标识符 */
  id: string;

  /** 活动批次名称，与创建时输入的名称一致 */
  batchName: string;

  /** 活动状态（数字值），与数据库存储的状态一致 */
  status: number;

  /** 活动状态文本，根据状态值翻译后的显示文本 */
  statusText: string;

  /** 活动开始时间戳（毫秒），便于前端处理 */
  startTime: number;

  /** 活动结束时间戳（毫秒），便于前端处理 */
  endTime: number;

  /** 总抽奖码数量，创建时设置的可发放数量 */
  totalCodes: number;

  /** 已使用抽奖码数量，当前已发放的抽奖码数量 */
  usedCodes: number;

  /** 创建时间戳（毫秒） */
  createdAt: number;

  /** 关联的奖品组信息 */
  prizeGroup?: PrizeGroupListDto;
}

/**
 * 活动批次详情传输对象
 * 用于服务端向前端返回活动批次的完整详细信息
 */
export class PrizeActivityInfoDto {
  constructor(activity: BblPrizeActivity) {
    this.id = activity.id;
    this.batchName = activity.batchName;
    this.batchDesc = activity.batchDesc;
    this.status = activity.status;
    this.statusText = getActivityStatusText(activity.status);
    this.startTime = activity.startTime ? activity.startTime.getTime() : 0;
    this.endTime = activity.endTime ? activity.endTime.getTime() : 0;
    this.totalCodes = activity.totalCodes;
    this.usedCodes = activity.usedCodes;
    this.createdAt = activity.createdAt.getTime();
    this.updatedAt = activity.updatedAt ? activity.updatedAt.getTime() : 0;
    this.createdBy = activity.createdBy;
    this.updatedBy = activity.updatedBy;
    this.prizeGroup = activity.prizeGroup
      ? new PrizeGroupListDto(activity.prizeGroup)
      : null;
  }

  /** 活动批次主键ID */
  id: string;

  /** 活动批次名称 */
  batchName: string;

  /** 活动批次描述 */
  batchDesc: string;

  /** 活动状态（数字值） */
  status: number;

  /** 活动状态文本 */
  statusText: string;

  /** 活动开始时间戳（毫秒） */
  startTime: number;

  /** 活动结束时间戳（毫秒） */
  endTime: number;

  /** 总抽奖码数量 */
  totalCodes: number;

  /** 已使用抽奖码数量 */
  usedCodes: number;

  /** 显示排序 */
  sortOrder: number;

  /** 创建时间戳（毫秒） */
  createdAt: number;

  /** 更新时间戳（毫秒），未更新时为0 */
  updatedAt: number;

  /** 创建人ID */
  createdBy: string;

  /** 更新人ID */
  updatedBy: string;

  /** 关联的奖品组信息 */
  prizeGroup?: PrizeGroupListDto;
}

/**
 * 获取活动状态列表（label-value格式）
 * @returns 包含所有活动状态的数组，每个元素包含label和value字段
 */
export function getActivityStatusOptions() {
  return Object.entries(ACTIVITY_STATUS_MAP).map(([value, label]) => ({
    value: Number(value),
    label
  }));
}

/**
 * 活动批次更新传输对象
 * 用于前端向服务端传递更新活动批次的必要信息
 */
export class PrizeActivityUpdateDto {
  /** 活动批次ID，需要更新的活动批次唯一标识符 */
  id: string;

  /** 活动批次名称，可选更新字段 */
  batchName?: string;

  /** 活动批次描述，可选更新字段 */
  batchDesc?: string;

  /** 活动状态，可选更新字段 */
  status?: number;

  /** 活动开始时间，可选更新字段，前端传递13位时间戳 */
  startTime?: number;

  /** 活动结束时间，可选更新字段，前端传递13位时间戳 */
  endTime?: number;

  /** 总抽奖码数量，可选更新字段 */
  totalCodes?: number;

  /** 奖品组ID，可选更新字段 */
  groupId?: string;
}
